# 函数变量的作用域

# 全局变量的作用域是在整个文件上,文件内定义的所有函数都可以使用
MIN_VALUE = 0
MAX_VALUE = 10


def check_range(n):
    # 不能在函数内部随意修改全局变量的值,否则会报错
    # 如果一定要修改,必须加上global声明
    global MAX_VALUE
    MAX_VALUE = 100

    # 如果在函数内部的局部变量与全局变量重名,那么在函数内部,局部变量的值会覆盖全局变量
    MIN_VALUE = 5

    print(f'in check_range, MAX_VALUE = {MAX_VALUE}, MIN_VALUE = {MIN_VALUE}')

    if n > MAX_VALUE or n < MIN_VALUE:
        raise Exception('input beyond range!')
    print(f'n = {n}')


def read_text_from_file(path):
    # fin为局部变量,仅在函数内部有效
    with open(path, 'r') as fin:
        text = fin.read()
        return text


# 对于函数嵌套的情况,如果内部函数想要修改外部函数的局部变量,必须使用nonlocal关键字
def outer():
    a = 1
    print(f'before invoke inner,a = {a}')

    def inner():
        # 通过nonlocal关键字,内部函数可以修改外部函数的局部变量
        # 如果不加nonlocal关键字,那么内部函数的变量和外部函数同名时,内部变量会覆盖外部的
        nonlocal a
        a = 2
        print(f'in inner,a = {a}')

    inner()
    print(f'after invoke inner,a = {a}')


if __name__ == '__main__':
    # text = read_text_from_file('in.txt')
    # print(text)

    # check_range(20)
    # print(f'in check_range, MAX_VALUE = {MAX_VALUE}, MIN_VALUE = {MIN_VALUE}')

    outer()
